Nastaveni predem nezname Property

Otázka od: Karel Pecinka

16. 11. 2004 16:45

Zdravim kolegy,
 
potreboval bych mit moznost nastavit neznamou property u komponenty, u
ktere neznam dopredu typ. Jinymi slovy potrebuju mit moznost v
konfiguracnim souboru zadat napr.: OK_Button.Caption=&OK nebo
OK_Button.Visible=false
 
Jak mam postupovat? Jedna z komponent RX nejak umi zjistit vsechny
properties na komponente, takze predpokladam, ze to nejak musi jit.
 
Diky za namety.
 
Karel


Odpovedá: dam

16. 11. 2004 16:59

Prostuduj si unit typinfo, ale je to docela pruda. Napovedet by Ti mohla i
ta RX knihovna.
David

===================================
Programovani, skoleni .NET, C++, Internet, Delphi
mailto:arthur@lerach.cz
mailto:arthur@argh.cz
http://www.argh.cz
ICQ: 345377828; msn: arthur@argh.cz
===================================

> -----Original Message-----
> From: delphi-l-owner@clexpert.cz
> [mailto:delphi-l-owner@clexpert.cz] On Behalf Of Karel Pecinka
> Sent: Tuesday, November 16, 2004 4:45 PM
> To: delphi-l@clexpert.cz
> Subject: Nastaveni predem nezname Property
>
> Zdravim kolegy,
>
> potreboval bych mit moznost nastavit neznamou property u komponenty, u
> ktere neznam dopredu typ. Jinymi slovy potrebuju mit moznost v
> konfiguracnim souboru zadat napr.: OK_Button.Caption=&OK nebo
> OK_Button.Visible=false
>
> Jak mam postupovat? Jedna z komponent RX nejak umi zjistit vsechny
> properties na komponente, takze predpokladam, ze to nejak musi jit.
>
> Diky za namety.
>
> Karel
>
>
>


Odpovedá: Karel Kral

16. 11. 2004 17:29

Pomoci RTTI, napr takto:

   PropInfo := GetPropInfo(Component.ClassInfo, 'DataSource');
   if PropInfo <> nil then
   begin
     ObjProp := GetObjectProp(Component, 'DataSource');
     if ObjProp is TDataSource then
     begin
       SetObjectProp(Component, 'DataSource', DataSource);
       Result := true;
       Exit;
     end;
   end;

Karel Pecinka napsal(a):
> Zdravim kolegy,
>
> potreboval bych mit moznost nastavit neznamou property u komponenty, u
> ktere neznam dopredu typ. Jinymi slovy potrebuju mit moznost v
> konfiguracnim souboru zadat napr.: OK_Button.Caption=&OK nebo
> OK_Button.Visible=false
>
> Jak mam postupovat? Jedna z komponent RX nejak umi zjistit vsechny
> properties na komponente, takze predpokladam, ze to nejak musi jit.
>
> Diky za namety.
>
> Karel
>
>
>
>
>


--
______________________________________________________
Karel Kral, vedouci odd. IT / IT manager
Purus, s.r.o., Cezavy 627, 664 56 Blucina, CZ
Tel: 547 235 000, 602 552 432, Fax: 547 231 203
E-Mail: mailto:kral@purus.cz, WWW: http://www.purus.cz
______________________________________________________


Odpovedá: Karel Pecinka

17. 11. 2004 1:36

Nakonec to nebylo zase tak nejhorsi. Zde je reseni, myslim ze se to
mnohym bude hodit. Do uses si pridejte TypInfo a prip. SynaUtil.

procedure SetProperty(AComponent: TComponent; CP: string; Value:
Variant);
var
  Component: TComponent;
  CompName, PropName: string;
begin
  CompName := SeparateLeft(CP, '.');
  PropName := SeparateRight(CP, '.');
  Component := AComponent.FindComponent(CompName);
  if Component <> nil then
  begin
    SetPropValue(Component, PropName, Value);
  end;
end;

function GetProperty(AComponent: TComponent; CP: string; PreferStrings:
Boolean): Variant;
var
  Component: TComponent;
  CompName, PropName: string;
begin
  CompName := SeparateLeft(CP, '.');
  PropName := SeparateRight(CP, '.');
  Component := AComponent.FindComponent(CompName);
  if Component <> nil then
  begin
    Result := string(GetPropValue(Component, PropName, PreferStrings));
  end;
end;

Pouziti:

SetProperty(MainForm, 'Button1.Caption', 'Ahoj');
SetProperty(MainForm, 'Button1.Visible', false) nebo
SetProperty(MainForm, 'Button1.Visible', 'false');

Parada co?

Karel

> Prostuduj si unit typinfo, ale je to docela pruda. Napovedet
> by Ti mohla i ta RX knihovna. David